Soy nuevo en Python y estoy haciendo un programa de prueba que reemplaza todas las letras en un texto dado con signos.
def encrypted(request): text = request.GET['text'] text = text.replace("a", "#.") text = text.replace("b", "##.") text = text.replace("c", "###.") text = text.replace("d", "####.") text = text.replace("e", "#####.") text = text.replace("f", "######.") etc... return render(request, 'encrypted.html', {'text': text})Lo he conseguido pero he probado a revertirlo de la misma manera y no funciona.
def decrypted(request): ftext = request.GET['text'] ftext = ftext.replace("#.", "a") ftext = ftext.replace("##.", "b") ftext = ftext.replace("###.", "c") ftext = ftext.replace("####.", "d") ftext = ftext.replace("#####.", "e") etc... return render(request, 'decrypted.html')Así que el texto no aparece en absoluto en la página.
<html lang="en"> <head> <meta charset="UTF-8"> <title>yCrypt</title> </head> <body> TEXT DECRYPTION: {{ftext}} </body> </html>Me pregunto por qué no muestra problemas de código en absoluto. ¿Quizás hay una manera más simple de hacer esto posible?
No estoy siguiendo completamente lo que está tratando de hacer aquí, pero su primera llamada de replace en la función decrypted y reemplazará cada aparición de "#". con la letra "a" en cada "letra encriptada", no solo la de "a".
Las llamadas posteriores a replace no coincidirán con nada porque su "#" final. ya ha sido reemplazada erróneamente por la letra "a".
Para que esto funcione según lo diseñado, tendría que invertir el orden de sus llamadas de replace para encontrar primero las coincidencias más largas.
Y para que se represente, también debe pasarlo en el contexto a su procesador de plantilla.
def decrypted(request): ftext = request.GET['text'] etc... ftext = ftext.replace("#####.", "e") ftext = ftext.replace("####.", "d") ftext = ftext.replace("###.", "c") ftext = ftext.replace("##.", "b") ftext = ftext.replace("#.", "a") return render(request, 'decrypted.html', { "ftext": ftext })No soy un experto pero puedes probar
def decrypted(request): ftext = request.GET['text'] ftext = ftext.replace("#.", "a") ftext = ftext.replace("##.", "b") ftext = ftext.replace("###.", "c") ftext = ftext.replace("####.", "d") ftext = ftext.replace("#####.", "e") return render(request, 'decrypted.html',{'ftext':ftext})La razón por la que no funciona es que la codificación de a es una subcadena de b, c, d, e, etc.
a = #. b = ##. c = ###. como se puede ver #. está al final de cada cadena codificada
Entonces, cuando codifica por primera vez, digamos abc , se convierte en #.##.###. Cuando ejecuta el paso de decodificación que usa replace("#.", "a") obtiene el resultado a#a##a donde cada #. se reemplaza por a y, como puede ver, no quedan puntos.
La solución es bastante simple en lugar de ###. formato, utilice .###. formato
a = .#. b = .##. c = .###. esto garantizará solo el número correcto de # coincidencias y no una subcadena.
Entonces, cuando codifica por primera vez, digamos abc , se convierte en .#..##..###. Cuando ejecuta el paso de decodificación que usa replace(".#.", "a") obtiene el resultado a.##..###. como puede ver, los códigos para b y c todavía están allí.
En una nota al margen, puede usar bucles para hacer que el código sea mucho más pequeño.